package com.szlanyou.thirdsdk.retrofit.callback;

import com.szlanyou.thirdsdk.retrofit.client.HttpMaster;
import com.szlanyou.thirdsdk.retrofit.client.IGeneralObserverReset;

/**
 * 网络请求结果处理
 * @author   @author 陈章 on 2016/6/21 0021.
 * des:
 * 不同的业务、不同的后台，返回的结构可能千奇百怪，需要适配的场景很多。
 * 如：
 * 有的后台将业务的异常放在业务的数据里返回，但是有的后台会将业务的异常放在链路层返回。
 * 所以没有一个统一的好的适配办法。
 */
public abstract class IHttpResultHandler<T>{
    /**
     * 本来是想保存{@link HttpMaster.GeneralObserver}的引用，但是它是个非static的内部类，无法直接引用。
     */
    protected IGeneralObserverReset generalObserver;

    public void attachGeneralObserver(IGeneralObserverReset generalObserver){
        this.generalObserver = generalObserver;
    }

    /**
     * 请求开始
     * @param requestPageFlag
     * @param requestCode
     */
    public abstract void onStart(String requestPageFlag,String requestCode);
    /**
     * 成功的回调
     * @param requestPageFlag
     * @param requestCode   请求码
     * @param successBean   结果回调实体
     */
    public abstract void onSuccess(String requestPageFlag,String requestCode, T successBean);

    /**
     * 异常的回调（网络链路层）
     * @param requestPageFlag
     * @param requestCode   请求码
     * @param e             失败异常
     */
    public abstract void onError(String requestPageFlag,String requestCode, Throwable e);

    /**
     * 失败的回调（业务层）
     * @param requestPageFlag
     * @param requestCode
     * @param responseCode
     * @param msg
     */
    public abstract void onFailure(String requestPageFlag,String requestCode, String responseCode,String msg);

    /**
     * 完成的回调
     * {@link IHttpResultHandler#onSuccess(String, String,Object)}与{@link IHttpResultHandler#onError(String, String, Throwable)}都会走此回调函数
     * 当然，如果你实现了{@link com.szlanyou.thirdsdk.retrofit.client.HttpClient#createResponseBodyHttpResultHandler(IHttpResultHandler)}
     * 应该在 {@link IHttpResultHandler#onFailure(String, String, String, String)}手动调用一下 {@link IHttpResultHandler#onComplete(boolean)} ()}方法。
     * @param causeByError      是否是在{@link #onError}之后调用的
     */
    public void onComplete(boolean causeByError){}

    /**
     * 请求取消
     * @param requestPageFlag
     * @param requestCode
     */
    public abstract void onCancel(String requestPageFlag,String requestCode);

    /**
     * 获取实例唯一的id
     * @return
     */
    public String getUniqueRequestId(){
       return String.valueOf(hashCode());
    }

    /**
     * 对于{@link com.szlanyou.thirdsdk.retrofit.convert.AbsResponseBodyHttpResultHandler},需要复写这个方法，将其
     * 构造方法传入的httpResultHandler返回。
     * @return
     */
    public IHttpResultHandler getOriginalHttpResultHandler(){
        return this;
    }
}
